#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/BEEP/beep.h"
#include "./BSP/KEY/key.h"
#include "./BSP/EXTI/exti.h"

/* 通过外部中断控制一个灯两灭 */
/**
 * @brief       KEYA4 外部中断服务程序
 * @param       无
 * @retval      无
 */
void KEYA4_INT_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(KEYA4_GPIO_PIN);         /* 调用中断处理公用函数，清除KEYA4所在中断线的中断标志位 */
    __HAL_GPIO_EXTI_CLEAR_IT(KEYA4_GPIO_PIN);         /* HAL库默认先清中断再处理回调，退出时再清一次中断，避免按键抖动误触发 */
}



/**
 * @brief       中断处理函数
                在HAL库中所有的外部中断服务函数都会调用此函数
 * @param       GPIO_Pin:中断引脚号
 * @retval      无
 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    delay_ms(20);      /* 消抖 */
    switch(GPIO_Pin)
    {
        case KEYA4_GPIO_PIN:
            if (KEYA4 == 0)
            {
                LEDA0_TOGGLE();
                BEEP_TOGGLE();
            }
            break;
    }
}

/**
 * @brief       外部中断初始化程序
 * @param       无
 * @retval      无
 */
void extix_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;
    
    /* 1.使能GPIO时钟 */
    KEYA4_GPIO_CLK_ENABLE();

    /* 2，设置EXTI和IO对应关系，在对应外设文件下 */
    gpio_init_struct.Pin = KEYA4_GPIO_PIN;
    /* 3，设置EXTI屏蔽，上/下沿 */
    gpio_init_struct.Mode = GPIO_MODE_IT_FALLING;            /* 下升沿触发 */
    /* 4.设置输入模式 */
    gpio_init_struct.Pull = GPIO_PULLUP;
    /* 5，使能AFIO/SYSCFG时钟 */
    HAL_GPIO_Init(KEYA4_GPIO_PORT, &gpio_init_struct);
    

    /* 6，设置NVIC */
    HAL_NVIC_SetPriority(KEYA4_INT_IRQn, 0, 2);               /* 抢占0，子优先级2 */
    HAL_NVIC_EnableIRQ(KEYA4_INT_IRQn);                       /* 使能中断线4 */
}












